import { getContext } from '/lib/context.js';

export async function generateReport({ relateFiles }) {
    const context = getContext();
    context.censorStatus = '正在生成报告，请耐心等待...';
    const censorType = +context.censorType;
    let prompt = '';
    let contentList = [];
    const censorTypeOption = context.censorTypeOptions.find(
        (e) => e.censorType == censorType
    );
    const points = censorTypeOption.censorList.slice();
    for (let pdfFile of relateFiles) {
        contentList.push({
            fileName: pdfFile.fileName,
            ocrContent: pdfFile.ocr,
            filePurpose: pdfFile.purpose,
        });
    }
    const title = censorTypeOption.title;
    switch (censorType) {
        case 1:
            prompt = `请根据json内容（演员证件、演员演出同意函、监护人同意书、未成年人证件等文件识别出的内容），
            回答以下问题：\n`;
            prompt += points.join('\n');
            prompt += `以下是内容输出的一些要求：
            1. 证件是否过期区块：要把所有演员列出来（包括国内和国外演员），必须含有这些字段：姓名（中文优先）、是否未成年、有效期、是否在有效期内
            2. 有效期写截止时期即可，不用写有效开始时间
            3. 标题请固定为：演员资料预查报告
            4. 每个问题为一个内容区块，以问题为标题，不用在乎问题文案长度
            5. 是否有未成年人监护人同意函，要写出“是否同意”的结果，要写出监护人姓名
            6. "判断是否与演员列表中一致"的意思是检查“演出同意函”是否各个演员都有签名(手写体)
            `;
            prompt += '\n';
            prompt += `以下是JSON内容：\n`;
            prompt += JSON.stringify(contentList, null, 2);
            prompt += '\n';
            prompt += `以下是JSON内容的说明：
            1. 字段is_expired：证件是否过期
            2. 字段is_adult：是否成年人
            3. 字段expiration：证件有效期
            4. filePurpose：是指这个文件的真正用途，是用文档的首页分析出来结果
            5. 演员证件有可能分别存在不同的文件里（id一样视为同一个人），请合在一起汇总
            6. ocrContent：是ocr把图片识别出来的文本内容，第一页内容可能与filePurpose重复
            7. id_card_side表示身份证件的正反面，如果是反面，请结合正面（利用id或姓名关联起来）一起判断
            `;
            break;
        case 2:
            prompt = `请根据json内容，回答以下问题：\n`;
            prompt += points.join('\n');
            prompt += '\n';
            prompt += `以下是JSON内容：\n`;
            prompt += JSON.stringify(contentList, null, 2);
            prompt += '\n';
            prompt += `注意：
            1. 只需告诉我有没有许可证就行，不必把JSON内容汇总出来
            2. 标题固定为：校验营业性演出许可证`;
            break;
        case 3:
            prompt = `请根据json内容，回答以下问题：\n`;
            prompt += points.join('\n');
            prompt += '\n';
            prompt += `以下是JSON内容：\n`;
            prompt += JSON.stringify(contentList, null, 2);
            prompt += '\n';
            prompt += `注意：
            1. 只需告诉我有没有营业执照就行，不必把JSON内容汇总出来
            2. 标题固定为：校验营业执照
            3. 如果有营业执照，请把执照的内容输出`;
            break;
        default:
            prompt = `请根据json内容，回答以下问题：\n`;
            prompt += points.join('\n');
            prompt += '\n';
            prompt += `以下是JSON内容：\n`;
            prompt += JSON.stringify(contentList, null, 2);
            prompt += '\n';
            prompt += `注意：
            1. 只需告诉我以上要点的结果就行，不必把所有JSON内容汇总出来
            2. 标题固定为：${title}`;
            break;
    }
    prompt += '\n';
    const baseInfo = context.baseInfo;
    prompt += `用户输入的信息：
    1. 演出名称：${baseInfo.performName}
    2. 演出时间：${baseInfo.performTime}
    3. 演出地点：${baseInfo.performLocation}`;
    prompt += '\n';
    prompt += `结果输出要求：
    1. 结果以html格式输出，便于给普通用户阅读。
    2. 不需要输出一个完整的html页面，只需内容部分即可，也就是没有body及以外的html标签
    3. 高亮显示结果
    `;
    const formData = new FormData();
    formData.append('prompt', prompt);
    const response = await fetch('/generate-report', {
        method: 'post',
        body: formData,
    });

    // let total = '';
    // const decoder = new TextDecoder();
    // for await (const chunk of response.body) {
    //     const decodeValue = decoder.decode(chunk);
    //     total += decodeValue;
    //     censorTypeOption.censorReport = total;
    //     const reportEl = document.querySelector('.censor-report');
    //     if (reportEl) {
    //         reportEl.scrollTop = reportEl.scrollHeight;
    //     }
    // }

    const decoder = new TextDecoder();
    const reader = response.body.getReader();
    let chunks = []; 

    function read() {
      reader.read().then(({ done, value }) => {
        if (done) {
          let decodedText = ''
          if(chunks.length > 0){
            chunks.forEach(res => {
              decodedText += decoder.decode(res)
            })
          }else{
            decodedText = decoder.decode(value)
          }

          try {
            let text = JSON.parse(decodedText)
            if(text.code === 200){
              let result = text.result
              const reportEl = document.querySelector('.censor-report');
              if (reportEl) {
                reportEl.textContent = result; // 显示文本内容
                reportEl.scrollTop = reportEl.scrollHeight; // 滚动到底部
              }
              censorTypeOption.censorReport = result
                .replace('```html', '')
                .replace('```', '');
            }
          } catch (error) {
            console.log(error)
          }
          
        } else {
          chunks.push(value);
          read();
        }
      }).catch(error => {
        console.error('Error reading the stream', error);
      });
    }

  read();
    
}
